package pt.iscte.daam.model;

import java.io.Serializable;
import java.util.Collection;
import java.util.LinkedList;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Table(name = "Imovel")
@Entity
public class Imovel implements Serializable {

	/**
	 * serialVersionUID
	 */
	private static final long serialVersionUID = -6963873484187720936L;

	public Imovel() {
		super();
		quartos = new LinkedList<Quarto>();
	}

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "IdImovel")
	private Long id;

	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "Senhorio")
	private Senhorio senhorio;

	@OneToMany
	@JoinColumn(name = "Imovel", referencedColumnName = "IdImovel")
	private Collection<EspacoComum> espacosComuns;
	
	@OneToMany(mappedBy = "imovel")
	private Collection<Quarto> quartos;
	
	@Column(name = "Detalhe")
	private String detalhe;

	@Column(name = "Localidade")
	private String localidade;

	@Column(name = "Conselho")
	private String conselho;

	@Column(name = "Distrito")
	private String distrito;

	@Column(name = "Pais")
	private String pais;

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public Senhorio getSenhorio() {
		return senhorio;
	}

	public void setSenhorio(Senhorio senhorio) {
		this.senhorio = senhorio;
		if(! senhorio.getImoveis().contains(this)){
			senhorio.getImoveis().add(this);
		}
	}

	public String getDetalhe() {
		return detalhe;
	}

	public void setDetalhe(String detalhe) {
		this.detalhe = detalhe;
	}

	public String getLocalidade() {
		return localidade;
	}

	public void setLocalidade(String localidade) {
		this.localidade = localidade;
	}

	public String getConselho() {
		return conselho;
	}

	public void setConselho(String conselho) {
		this.conselho = conselho;
	}

	public String getDistrito() {
		return distrito;
	}

	public void setDistrito(String distrito) {
		this.distrito = distrito;
	}

	public String getPais() {
		return pais;
	}

	public void setPais(String pais) {
		this.pais = pais;
	}

	public Collection<EspacoComum> getEspacosComuns() {
		return espacosComuns;
	}

	//FIXME isto funciona :P
	public void adicionaEspacoComum(EspacoComum espacoComum) {
		espacosComuns.add(espacoComum);
	}

	public Collection<Quarto> getQuartos() {
		return quartos;
	}

	public void adicionaQuarto(Quarto quarto) {
		this.quartos.add(quarto);
		if(quarto.getImovel() != this){
			quarto.setImovel(this);
		}
	}

}
